/* 
    1.  Promise 就是一个类 在执行这个类的时候 需要传递一个执行器进去 执行器会立即执行
    2.  Promise 中有三种状态 分别为 成功 fulfilled 失败 rejected 等待 pending
        pending -> fulfilled
        pending -> rejected
        一旦状态确定就补课更改
    3.  resolve和reject函数是用来更改状态的
        resolve: fulfilled
        reject: rejected
    4. then方法内部做的事情就是判断状态 如果状态是成功 调用成功回调函数 如果状态是失败 调用失败回调函数 then方法时被定义在原型对象当中
    5. then 成功回调有一个参数  表示成功之后的值 then失败回调有一个参数  表示失败后的原因
    6. 同一个promise对象下面的then方法是可以被调用多次的
    7. then方法是可以被链式调用的, 后面then方法的回调函数拿到值的是上一个then方法的回调函数的返回值
*/


const MyPromise = require('./myPromise');

function p1 () {
    return new MyPromise(function (resolve, reject) {
        setTimeout(function () {
            resolve('p1')
        }, 2000)
    })
}

function p2 () {
    return new MyPromise(function (resolve, reject) {
        resolve('p2 reject')
        // resolve('p2 resolve')
    })
}   

//MyPromise.all(['a', 'b', p1(), p2(), 'c']).then(result => console.log(result))

// MyPromise.resolve(100).then(value => console.log(value))
// MyPromise.resolve(p1 ()).then(value => console.log(value))

// p2().finally(() => {
//     console.log('finally');
//     return p1();
// }).then(value => {
//     console.log(value);
// }, reason => {
//     console.log(reason);
// }) 

p2()
    .then(value => {console.log(value);})
    .catch(reason => console.log(reason))


// let promise = new Promise( (resolve, reject) => {
//     //添加异步函数后  将会立即执行then 则会判断状态
//     // setTimeout( () => {
//     //     resolve('成功 .....')
//     // }, 2000)
//     // throw new Error('executor error')
//     // resolve('成功')
//     reject('失败')
// })

// function other () {
//     return  new MyPromise((resolve, reject) => {
//         resolve('other')
//     })
// }

// let p1 = promise.then( value => {
//     console.log(value);
//     return p1;
// })


// promise.then().then().then(value => console.log(value), reason => console.log( reason ))


// promise.then(value => {
//     console.log(value);
//     //throw new Error('then error')
//     return 'aaa'
// }, reason => {
//     console.log(reason);
//     return 10000
// }).then(value => {
//     console.log(value);
// })


// .then(value => {
//     console.log(value);
// }, reason => {
//     console.log('aaaaa');
//     console.log(reason.message);
// })

// promise.then( value => {
//     console.log(2);
//     console.log(value);
// }, reason => {
//     console.log(reason);
// })

// promise.then( value => {
//     console.log(3);
//     console.log(value);
// }, reason => {
//     console.log(reason);
// })